{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lab 2: 鲍鱼数据集回归\n",
    "\n",
    "## 数据描述\n",
    "\n",
    "在这个实验中，我们将使用深度学习来完成鲍鱼数据集回归任务，数据集 `Abalone_2000.csv` 包含了 2000 条数据，任务目标是通过各种物理测量来预测鲍鱼的年龄。以下是数据集中相关变量的描述：\n",
    "\n",
    "- Sex: 性别（M：雄性，F：雌性，I：幼体）\n",
    "- Length: 最长壳长度测量值（单位：毫米）\n",
    "- Diameter: 壳的直径，与长度垂直（单位：毫米）\n",
    "- Height: 带肉的壳的高度（单位：毫米）\n",
    "- Whole_weight: 整个鲍鱼的重量（单位：克）\n",
    "- Whole weight.1: 去壳后肉的重量（单位：克）\n",
    "- Whole weight.2: 内脏重量（去血后的肠道重量，单位：克）\n",
    "- Shell_weight: 壳干燥后的重量（单位：克）  \n",
    "\n",
    "- Rings: 环数，表示鲍鱼的年龄（单位：年）\n",
    "\n",
    "## 评估指标\n",
    "\n",
    "均方对数误差 (Root Mean Squared Logarithmic Error, RMSLE)，它用于衡量预测值$\\hat{y}_i$和真实值$y_i$之间的对数误差。公式如下：  \n",
    "\n",
    "$$\n",
    "RMSLE = \\sqrt{\\frac{1}{n} \\sum_{i=1}^{n} \\left( \\log(1 + \\hat{y}_i) - \\log(1 + y_i) \\right)^2 }\n",
    "$$  \n",
    "\n",
    "## 要求\n",
    "\n",
    "50个epoch内，在测试集上的RMSLE小于0.16\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预处理\n",
    "\n",
    "我们先读取并观察数据的格式\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Sex</th>\n",
       "      <th>Length</th>\n",
       "      <th>Diameter</th>\n",
       "      <th>Height</th>\n",
       "      <th>Whole weight</th>\n",
       "      <th>Whole weight.1</th>\n",
       "      <th>Whole weight.2</th>\n",
       "      <th>Shell weight</th>\n",
       "      <th>Rings</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>F</td>\n",
       "      <td>0.550</td>\n",
       "      <td>0.430</td>\n",
       "      <td>0.150</td>\n",
       "      <td>0.7715</td>\n",
       "      <td>0.3285</td>\n",
       "      <td>0.1465</td>\n",
       "      <td>0.2400</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>F</td>\n",
       "      <td>0.630</td>\n",
       "      <td>0.490</td>\n",
       "      <td>0.145</td>\n",
       "      <td>1.1300</td>\n",
       "      <td>0.4580</td>\n",
       "      <td>0.2765</td>\n",
       "      <td>0.3200</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>I</td>\n",
       "      <td>0.160</td>\n",
       "      <td>0.110</td>\n",
       "      <td>0.025</td>\n",
       "      <td>0.0210</td>\n",
       "      <td>0.0055</td>\n",
       "      <td>0.0030</td>\n",
       "      <td>0.0050</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>M</td>\n",
       "      <td>0.595</td>\n",
       "      <td>0.475</td>\n",
       "      <td>0.150</td>\n",
       "      <td>0.9145</td>\n",
       "      <td>0.3755</td>\n",
       "      <td>0.2055</td>\n",
       "      <td>0.2500</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>I</td>\n",
       "      <td>0.555</td>\n",
       "      <td>0.425</td>\n",
       "      <td>0.130</td>\n",
       "      <td>0.7820</td>\n",
       "      <td>0.3695</td>\n",
       "      <td>0.1600</td>\n",
       "      <td>0.1975</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1995</th>\n",
       "      <td>I</td>\n",
       "      <td>0.205</td>\n",
       "      <td>0.125</td>\n",
       "      <td>0.055</td>\n",
       "      <td>0.0420</td>\n",
       "      <td>0.0165</td>\n",
       "      <td>0.0055</td>\n",
       "      <td>0.0080</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1996</th>\n",
       "      <td>M</td>\n",
       "      <td>0.620</td>\n",
       "      <td>0.485</td>\n",
       "      <td>0.165</td>\n",
       "      <td>1.0680</td>\n",
       "      <td>0.4235</td>\n",
       "      <td>0.1990</td>\n",
       "      <td>0.3500</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1997</th>\n",
       "      <td>F</td>\n",
       "      <td>0.585</td>\n",
       "      <td>0.465</td>\n",
       "      <td>0.145</td>\n",
       "      <td>0.9810</td>\n",
       "      <td>0.3335</td>\n",
       "      <td>0.2245</td>\n",
       "      <td>0.3150</td>\n",
       "      <td>13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1998</th>\n",
       "      <td>I</td>\n",
       "      <td>0.300</td>\n",
       "      <td>0.230</td>\n",
       "      <td>0.075</td>\n",
       "      <td>0.1495</td>\n",
       "      <td>0.0530</td>\n",
       "      <td>0.0415</td>\n",
       "      <td>0.0350</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1999</th>\n",
       "      <td>F</td>\n",
       "      <td>0.535</td>\n",
       "      <td>0.405</td>\n",
       "      <td>0.130</td>\n",
       "      <td>0.7170</td>\n",
       "      <td>0.3460</td>\n",
       "      <td>0.1775</td>\n",
       "      <td>0.1950</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2000 rows × 9 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     Sex  Length  Diameter  Height  Whole weight  Whole weight.1  \\\n",
       "0      F   0.550     0.430   0.150        0.7715          0.3285   \n",
       "1      F   0.630     0.490   0.145        1.1300          0.4580   \n",
       "2      I   0.160     0.110   0.025        0.0210          0.0055   \n",
       "3      M   0.595     0.475   0.150        0.9145          0.3755   \n",
       "4      I   0.555     0.425   0.130        0.7820          0.3695   \n",
       "...   ..     ...       ...     ...           ...             ...   \n",
       "1995   I   0.205     0.125   0.055        0.0420          0.0165   \n",
       "1996   M   0.620     0.485   0.165        1.0680          0.4235   \n",
       "1997   F   0.585     0.465   0.145        0.9810          0.3335   \n",
       "1998   I   0.300     0.230   0.075        0.1495          0.0530   \n",
       "1999   F   0.535     0.405   0.130        0.7170          0.3460   \n",
       "\n",
       "      Whole weight.2  Shell weight  Rings  \n",
       "0             0.1465        0.2400     11  \n",
       "1             0.2765        0.3200     11  \n",
       "2             0.0030        0.0050      6  \n",
       "3             0.2055        0.2500     10  \n",
       "4             0.1600        0.1975      9  \n",
       "...              ...           ...    ...  \n",
       "1995          0.0055        0.0080      4  \n",
       "1996          0.1990        0.3500     12  \n",
       "1997          0.2245        0.3150     13  \n",
       "1998          0.0415        0.0350      7  \n",
       "1999          0.1775        0.1950      8  \n",
       "\n",
       "[2000 rows x 9 columns]"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_csv(\"Abalone_2000.csv\")\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，我们的数据集中有 2000 个样本，每个样本有 8 个特征和 1 个标签（Rings）。\n",
    "\n",
    "接下来需要对特征进行处理。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((2000, 8), (2000, 1))"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import LabelEncoder, StandardScaler, OneHotEncoder, OrdinalEncoder\n",
    "import numpy as np\n",
    "\n",
    "def preprocess_data(df):\n",
    "\n",
    "    nominal_features = [\"Sex\"]\n",
    "    numerical_feature_label = [\"Length\", \"Diameter\", \"Height\", \"Whole weight\", \"Whole weight.1\", \"Whole weight.2\", \"Shell weight\"]\n",
    "\n",
    "    encoder = OneHotEncoder(drop='first', sparse_output=False)\n",
    "    categorical_encoded = encoder.fit_transform(df[nominal_features])\n",
    "\n",
    "    scaler = StandardScaler()\n",
    "    numerical_scaled = scaler.fit_transform(df[numerical_feature_label])\n",
    "\n",
    "    features = np.hstack((numerical_scaled[:, :-1], categorical_encoded))\n",
    "    labels = df[\"Rings\"].values.reshape(-1, 1)\n",
    "\n",
    "    return features, labels\n",
    "\n",
    "\n",
    "features, labels = preprocess_data(df)\n",
    "features.shape, labels.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据集的划分与加载\n",
    "\n",
    "我们按照80%，20%的比例将原数据集分为训练集和测试集。\n",
    "  \n",
    "为了保证实验结果的可复现性，我们设置随机数种子 seed=42。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train dataset size: 1600\n",
      "Test dataset size: 400\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)\n",
    "print(f\"Train dataset size: {len(X_train)}\")\n",
    "print(f\"Test dataset size: {len(X_test)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们创建一个`AbaloneDataset`类，继承自`torch.utils.data.Dataset`，这样方面后续处理与加载。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "\n",
    "class AbaloneDataset(Dataset):\n",
    "    def __init__(self, features, labels):\n",
    "        self.X = torch.tensor(features, dtype=torch.float)\n",
    "        self.y = torch.tensor(labels, dtype=torch.float)\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.X)\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        return self.X[idx], self.y[idx]\n",
    "\n",
    "\n",
    "batch_size =64\n",
    "train_dataset = AbaloneDataset(X_train, y_train)\n",
    "test_dataset = AbaloneDataset(X_test, y_test)\n",
    "train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n",
    "test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构建 MLP 网络\n",
    "\n",
    "我们创建一个多层感知机（MLP）网络，包含一个输入层、任意个隐藏层和一个输出层。其中，输入层的维度为 8，即数据集中的特征数；输出层的维度为 1，即数据集中的标签数。隐藏层的维度可以自行设置。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch.nn as nn\n",
    "\n",
    "class MLP(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size, output_size):\n",
    "        super(MLP, self).__init__()\n",
    "        self.fc1 = nn.Linear(input_size, hidden_size)\n",
    "        self.relu = nn.ReLU()\n",
    "        self.fc2 = nn.Linear(hidden_size, hidden_size)\n",
    "        self.fc3 = nn.Linear(hidden_size, output_size)\n",
    "    \n",
    "    def forward(self, x):\n",
    "        x = self.relu(self.fc1(x))\n",
    "        x = self.relu(self.fc2(x))\n",
    "        x = self.fc3(x)\n",
    "        return x\n",
    "    \n",
    "input_size = X_train.shape[1]\n",
    "hidden_size = 128\n",
    "output_size = 1\n",
    "model = MLP(input_size, hidden_size, output_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练与测试\n",
    "\n",
    "我们将训练一个 epoch 的代码封装在`train_epoch`函数中，其中流程如下：\n",
    "\n",
    "1. 遍历训练集，将数据输入模型，得到预测值；\n",
    "2. 计算预测值与真实值之间的差值，然后计算损失；\n",
    "3. 通过反向传播更新模型参数。\n",
    "4. 返回训练集上的平均损失。\n",
    "\n",
    "然后我们实现了一个`eval_model`函数来评估模型的性能：\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Accumulator:\n",
    "    def __init__(self, n):\n",
    "        self.data = [0.0] * n\n",
    "\n",
    "    def add(self, *args):\n",
    "        self.data = [a + float(b) for a, b in zip(self.data, args)]\n",
    "\n",
    "    def reset(self):\n",
    "        self.data = [0.0] * len(self.data)\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        return self.data[idx]\n",
    "\n",
    "\n",
    "def train_epoch(net, device, train_iter, loss_fn, optimizer):\n",
    "    # 将模型设置为训练模式\n",
    "    net.train()\n",
    "    metrics = Accumulator(2)\n",
    "    for X, y in train_iter:\n",
    "        X, y = X.to(device), y.to(device)\n",
    "        # 计算梯度并更新参数\n",
    "        y_hat = net(X)\n",
    "        loss = loss_fn(y_hat.view(-1), y.view(-1))\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        metrics.add(loss * len(y),  len(y))\n",
    "    train_loss = metrics[0] / metrics[1]\n",
    "    return train_loss\n",
    "\n",
    "\n",
    "@torch.no_grad()\n",
    "def eval_model(net, device, test_iter, loss_fn):\n",
    "    net.eval()\n",
    "    metrics = Accumulator(2)\n",
    "    for X, y in test_iter:\n",
    "        X, y = X.to(device), y.to(device)\n",
    "        y_hat = net(X)\n",
    "        loss = loss_fn(y_hat.view(-1), y.view(-1))\n",
    "        metrics.add(loss * len(y), len(y))\n",
    "    test_loss = metrics[0] / metrics[1]\n",
    "    return test_loss\n",
    "\n",
    "\n",
    "class RMSLELoss(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(RMSLELoss, self).__init__()\n",
    "\n",
    "    def forward(self, y_hat, y_true):\n",
    "        log_y_hat = torch.log1p(y_hat)  # 计算 log(1 + y_hat)\n",
    "        log_y_true = torch.log1p(y_true)  # 计算 log(1 + y_true)\n",
    "        loss = torch.mean((log_y_hat - log_y_true) ** 2)  # 计算均方误差\n",
    "        loss = torch.sqrt(loss)\n",
    "        return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/50 - Train Loss: 76.154590 - Test Loss: 48.436455 \n",
      "Epoch 2/50 - Train Loss: 27.261253 - Test Loss: 19.250904 \n",
      "Epoch 3/50 - Train Loss: 14.223881 - Test Loss: 10.782398 \n",
      "Epoch 4/50 - Train Loss: 8.795619 - Test Loss: 7.230506 \n",
      "Epoch 5/50 - Train Loss: 6.730944 - Test Loss: 6.096847 \n",
      "Epoch 6/50 - Train Loss: 5.911686 - Test Loss: 5.401309 \n",
      "Epoch 7/50 - Train Loss: 5.335773 - Test Loss: 4.907635 \n",
      "Epoch 8/50 - Train Loss: 4.851838 - Test Loss: 4.535309 \n",
      "Epoch 9/50 - Train Loss: 4.540104 - Test Loss: 4.274316 \n",
      "Epoch 10/50 - Train Loss: 4.277085 - Test Loss: 4.081139 \n",
      "Epoch 11/50 - Train Loss: 4.092915 - Test Loss: 3.986096 \n",
      "Epoch 12/50 - Train Loss: 3.996813 - Test Loss: 3.924946 \n",
      "Epoch 13/50 - Train Loss: 3.939512 - Test Loss: 3.794607 \n",
      "Epoch 14/50 - Train Loss: 3.802379 - Test Loss: 3.779006 \n",
      "Epoch 15/50 - Train Loss: 3.738839 - Test Loss: 3.782476 \n",
      "Epoch 16/50 - Train Loss: 3.698491 - Test Loss: 3.728584 \n",
      "Epoch 17/50 - Train Loss: 3.643546 - Test Loss: 3.600228 \n",
      "Epoch 18/50 - Train Loss: 3.561143 - Test Loss: 3.612076 \n",
      "Epoch 19/50 - Train Loss: 3.544177 - Test Loss: 3.579952 \n",
      "Epoch 20/50 - Train Loss: 3.508359 - Test Loss: 3.530063 \n",
      "Epoch 21/50 - Train Loss: 3.485165 - Test Loss: 3.518622 \n",
      "Epoch 22/50 - Train Loss: 3.487602 - Test Loss: 3.595871 \n",
      "Epoch 23/50 - Train Loss: 3.432881 - Test Loss: 3.521111 \n",
      "Epoch 24/50 - Train Loss: 3.443242 - Test Loss: 3.492172 \n",
      "Epoch 25/50 - Train Loss: 3.455480 - Test Loss: 3.529766 \n",
      "Epoch 26/50 - Train Loss: 3.404176 - Test Loss: 3.459532 \n",
      "Epoch 27/50 - Train Loss: 3.351820 - Test Loss: 3.541528 \n",
      "Epoch 28/50 - Train Loss: 3.415721 - Test Loss: 3.473943 \n",
      "Epoch 29/50 - Train Loss: 3.381400 - Test Loss: 3.449619 \n",
      "Epoch 30/50 - Train Loss: 3.340850 - Test Loss: 3.458951 \n",
      "Epoch 31/50 - Train Loss: 3.401195 - Test Loss: 3.443331 \n",
      "Epoch 32/50 - Train Loss: 3.306161 - Test Loss: 3.456378 \n",
      "Epoch 33/50 - Train Loss: 3.340941 - Test Loss: 3.488842 \n",
      "Epoch 34/50 - Train Loss: 3.293522 - Test Loss: 3.440368 \n",
      "Epoch 35/50 - Train Loss: 3.258151 - Test Loss: 3.553149 \n",
      "Epoch 36/50 - Train Loss: 3.278202 - Test Loss: 3.446948 \n",
      "Epoch 37/50 - Train Loss: 3.320417 - Test Loss: 3.464718 \n",
      "Epoch 38/50 - Train Loss: 3.258625 - Test Loss: 3.424418 \n",
      "Epoch 39/50 - Train Loss: 3.227669 - Test Loss: 3.463576 \n",
      "Epoch 40/50 - Train Loss: 3.238390 - Test Loss: 3.431867 \n",
      "Epoch 41/50 - Train Loss: 3.253672 - Test Loss: 3.459996 \n",
      "Epoch 42/50 - Train Loss: 3.292700 - Test Loss: 3.440256 \n",
      "Epoch 43/50 - Train Loss: 3.187951 - Test Loss: 3.422914 \n",
      "Epoch 44/50 - Train Loss: 3.183634 - Test Loss: 3.415623 \n",
      "Epoch 45/50 - Train Loss: 3.187688 - Test Loss: 3.421922 \n",
      "Epoch 46/50 - Train Loss: 3.205595 - Test Loss: 3.418013 \n",
      "Epoch 47/50 - Train Loss: 3.330521 - Test Loss: 3.635168 \n",
      "Epoch 48/50 - Train Loss: 3.229191 - Test Loss: 3.408439 \n",
      "Epoch 49/50 - Train Loss: 3.147195 - Test Loss: 3.421618 \n",
      "Epoch 50/50 - Train Loss: 3.198951 - Test Loss: 3.409243 \n"
     ]
    }
   ],
   "source": [
    "epochs = 50\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "model = model.to(device)\n",
    "loss_fn = nn.MSELoss()\n",
    "\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n",
    "train_ls, test_ls = [], []\n",
    "\n",
    "for epoch in range(1, epochs + 1):\n",
    "    train_loss= train_epoch(model, device, train_loader, loss_fn, optimizer)\n",
    "    test_loss = eval_model(model, device, test_loader, loss_fn)\n",
    "    print(\n",
    "        f\"Epoch {epoch}/{epochs} - Train Loss: {train_loss:.6f} - Test Loss: {test_loss:.6f} \"\n",
    "    )\n",
    "    train_ls.append(train_loss)\n",
    "    test_ls.append(test_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "画出模型在训练集和测试集上的 Loss 曲线。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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nz5dfr9fp556arNf5tG/f3/dfvvteuSRR/TFF1/o1FNP1Z133qmBAweqpKREb775ph5//HEFg0G53W49/fTTluf/8MMPOuecc3TiiSdq3LhxGjRokLp06SIpHDDMnTs3sjxjwIABlu1Mp0+frquuukoXX3yxfvSjH6lv375q1aqV9u7dq7y8PM2YMSOyQ8rNN98cp59I4yOgQNxkuZ2qKDsUULCTBwAAABAfLVq00K9+9Ss9/PDDWr16tS644ALL9Q8++EAjR4487Ne97bbb9N577+ndd9/Vxo0bdcMNN1iuZ2Vl6YUXXtDChQubfUAhSQ8++KBKSkr05JNPatOmTZFmldFatWqll19+WQMGDKjxNdatW6d169bV+j369Omj1157LaZvSGlpqebNm6d58+bV+DyHw6F7771Xl156aYPfT7IhoEDc+NxO7S+rjJxTQQEAAADEz4MPPqiePXvqhRde0FdffaX9+/crGDy6/yfPyMjQwoUL9dRTT+mFF17QunXrZJqmunTpovPOO0+33Xab+vTpo4ULFzbSu0gsh8Ohv/zlL5owYYKefvppLV++XDt27JDH49Hxxx+vUaNGacqUKerQoUPMc8866ywtWbJE77zzjlauXKmtW7dqx44dKi8vV9u2bXXKKafosssu08SJE+XxWHevmTNnjt566y0tWbJE69at0/bt21VUVKTMzEx169ZNZ599tm6++WadfPLJ8fpRNAnDTIWNaNPYtm3b1LVrV0nhsqCcnJwEz6h25z22VN/uLI6c/+XKU3XxyZ3qeAYAAABS1TfffKNAICCXyxXpYwAg/o7kd7GpPofSJBNx47M1yiyhSSYAAAAAoAoBBeLGvpNHKT0oAAAAAABVCCgQNz63teVJCT0oAAAAAABVCCgQN16PNaAoZYkHAAAAAKAKAQXixt6Dgl08AAAAAADVCCgQN17bEo9SPwEFAAAAACCMgAJx42UXDwAAAABALQgoEDdeD0s8AAAAAAA1I6BA3Nh38aBJJgAAAACgGgEF4sa+xIMKCgAAAABANQIKxI29SWaJnwoKAAAAAEAYAQXihh4UAAAAAIDaEFAgbuw9KKigAAAAAABUI6BA3Nh7UJRVUkEBAAAAAAgjoEDc+DzWCorKoKmKQChBswEAAAAAJBMCCsSNvYJCYqtRAAAAAEAYAQXipqaAooRGmQAAAAAApWlAMXLkSBmGcViPJUuW1Pp6ixYt0rhx45STkyOPx6OcnByNGzdOixYtit+bagbs24xKUhkVFAAAAAAASbGfGBHD4XCoZ8+eMeOhUEiTJk3SrFmzLOP5+fnKz8/X/PnzdeONN+rpp5+Ww5GWWZCF02EoM8Oh8spDfSdK/FRQAAAAAADSNKD429/+ppKSkjrvWbdunX76059Kks4991x16dIl5p677rorEk4MHDhQd9xxh3r06KFNmzbp4Ycf1po1azRz5kx16NBBf/rTnxr/jTRDXrdL5ZUVkfMSKigAAAAANJElS5bonHPOkSR98MEHGjlyZGInhDqlZUCRm5tb7z0vvvhi5Piaa66Jub5x40Y9+uijkqRBgwZp2bJlysrKkiQNHjxYl1xyiUaMGKG8vDw98sgjuv7663XCCSc00jtovrxup/ZEZUOlVFAAAAAAAJSmPSjqEwqF9Pe//12SlJ2drcsuuyzmnunTpysQCP/t/4wZMyLhRDWv16sZM2ZIkgKBgKZNm9bEs24efLY+FFRQAAAAAE3vueeei/TX27JlS6KnU6fqed5zzz2JngrijICiBosXL1Z+fr4k6cc//rG8Xq/lummaWrBggSSpT58+Gjp0aI2vM3ToUPXu3VuStGDBApmm2YSzbh68HutOHmXs4gEAAAAAEAFFjV544YXIcU3LOzZv3qyCggJJ0ogRI+p8rerr+fn5SZ9UxkNsBQUBBQAAAACAgCJGcXGxXn/9dUlSt27damyism7dushxnz596ny96Ovr169vnEk2Y1luawVFqZ8lHgAAAAAAAooYr776amSHj6uvvlqGYcTcs23btshxTk5Ona/XtWvXyPHWrVsPez7btm2r81FYWHjYr5lIPltAQQUFAAAA0HSWLFkiwzB03XXXRcZyc3MjfR6qH0uWLKnx+fPnz9dPfvITHXfcccrMzFTr1q01aNAg3Xvvvdq7d2+d33vjxo2aPHmy+vXrpxYtWsjtdqtz584aMGCArr/+es2dO1d+vz9yf/fu3S2fv+69996YeU6cOPGofh61KS4u1oMPPqhhw4apbdu28ng8ysnJ0Y9//GO99dZb9T7/s88+0w033KBevXrJ5/MpMzNTXbt21WmnnaZf/vKXeuONN2pc8l9eXq7HH39cI0eOVIcOHZSRkaG2bduqd+/euuiii/TYY4+lVSV+Wu7iUZf6lndI0sGDByPH2dnZdb6ez+eLHBcXFx/2fKIDjlTg9Vj/yJXRJBMAAABIOnv37tWPf/xjvf/++5Zxv9+vzz77TJ999pmefPJJLViwoMaefPPmzdPVV1+tiooKy3hhYaEKCwv1xRdf6G9/+5u+/PJL9evXr0nfS33WrFmj0aNHR5bxV8vPz9err76qV199VZdddpn+/ve/KzMzM+b506ZN029+8xuFQiHLePVfKq9evVpPPvmkDh48aPn8WFhYqPPOO89SoS+Ff/Z79+7Vxo0b9a9//UsFBQWRHSRTHQFFlG3btkWSw6FDh6pXr1413ldeXh45drvddb6mx+OJHJeVlR39JJs5KigAAACA+Bk8eLC+/PJLLViwQHfffbck6Z133lHnzp0t9+Xm5kaO/X6/zjvvPK1evVpOp1NXXnmlRo0apdzcXFVWVmrZsmV67LHHtHPnTo0aNUpr1qxRt27dIs/fsWOHrrvuOlVUVKhjx4669dZbNXToULVv315lZWX69ttvtXTpUs2fP98yh3fffVcVFRXq37+/JOmWW27RL37xC8s9bdq0acwfj/Lz83Xuuedq7969kQqNCRMmqF27dlq3bp3+93//V1988YVee+01TZw4Uf/85z8tz//Pf/4TCSdyc3N16623asCAAWrbtq0OHjyor7/+Wh988EFkk4VokydPjoQTV199tS677DJ17txZTqdThYWFysvLq/F5qYyAIspLL70USb2uvfbaWu+LTs3siaBddMmSfSvShqhvWUhhYaGGDBly2K+bKFm2JpmlVFAAAACgNqGQVLYn0bOIr6y2kqPxVuL7fD7169dPeXl5kbFevXqpe/futT7nj3/8o1avXq3WrVvr3//+t0477TTL9TPPPFNXXXWVhg0bpsLCQv2///f/9Pe//z1yfeHChZFl84sXL46pkDjjjDN0zTXX6IknnrCM2/+CuGPHjk1eXTFlypTIUpVnn31WN9xwQ+Taaaedpssvv1wXXXSRPvjgA82dO1fXXnutLrroosg9r7zyikKhkHw+nz7++GMdc8wxltc/66yzdOONN2r//v2W3SHLy8v1xhtvSJJuv/32GiskxowZo3vvvVd79qTP7wABRZQXX3xRUrjq4ac//Wmt97Vo0SJyXN+yjepfTKn+5SA1qa/HRXMTU0Hhp4ICAAAAtSjbIz3SI9GziK+p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CQAAAADpKC0rKEpKSiLH5eXl8nq9+uCDDyLNLCXp7LPP1vvvv69hw4bpiy++0Ouvv65PPvlEp59+euR51Wra4SNa9PKQsrKyw5prfRUXhYWFGjJkyGG9ZrKw96CQpFIaZQIAAABAWkrLgCIzM9NyfuONN1rCiWpZWVl64IEHIk00586dGwkool+joqKizu/n9/str3k4Gms/2WTkdBjKzHCovDIUGSthq1EAAAAASEtpucSjRYsWlvMLLrig1nvPPffcyBakn376aY2vUd+yjeiKjfqWg6Qbn9uakVFBAQAAAADpKS0DCo/How4dOkTO62pEmZmZqfbt20uSdu3aFRmPrmyob6eN6GUaqdz08kh4PbFbjQIAAAAA0k9aBhSSdNJJJ0WOg8G6PxRXX6+upJCkE088MXJcvSNIbaKv9+3b97DmmersFRQlFVRQAAAAAEA6StuA4uyzz44cf/fdd7Xed+DAARUVFUmSunTpEhnPzc1V586dJUlLly6t83stW7Ys8vzu3bsf6ZRTUpabCgoAAAAAQBoHFOPHj48cv/7667Xe9/rrr8s0TUnSWWedFRk3DENjx46VFK6QWLlyZY3PX7lyZaSCYuzYsTIM46jnnkpiKijoQQEAAAAAaSltA4qTTz5ZF110kSRpzpw5Wrx4ccw927dv19133y0pvJXoddddZ7k+ZcoUOZ3hCoDJkyfHbCFaVlamyZMnSwovD5kyZUpjv41mz0sFBQAAAABAaRxQSNL06dPVunVrhUIhjR49Wv/zP/+j5cuXKy8vT08++aQGDx4caYB53333WZZ4SFKvXr00depUSVJeXp6GDx+uuXPnKi8vT3PnztXw4cOVl5cnSZo6dap69uwZ3zfYDPg8tl08CCgAAAAAIC256r8ldfXq1UtvvvmmfvzjH2vHjh168MEH9eCDD1ruMQxDd911l+64444aX+OBBx7Qzp07NXv2bK1Zs0YTJkyIueeGG27Q/fff3yTvobmL7UHBEg8AAAAASEdpXUEhSWeeeaa++uor/eEPf9App5yili1bKjMzU7m5ubruuuv02Wef6b777qv1+Q6HQ7NmzdLChQs1duxYde7cWW63W507d9bYsWP19ttva+bMmXI40v5HXSOfLaAo8VNBAQAAAADpKK0rKKq1a9dO99xzj+65554jfo1Ro0Zp1KhRjTepNOF125d4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pz/84Q+H/fzMzMzIcUVFRZ33+v3+yLG990Z96lsSUlhYqCFDhhzWayYN+04eUQGFJPncTktjzBJ28gAAAACAlBX3gKJnz5568cUXdf3116ukpCSyfKN169aaM2dOTDXC9u3b9d5770mSfvSjHzXKHDZs2KA///nPkqQZM2ZYlmA0VHVfDKn+ZRslJYf6LNS3HMSuvv4WzZo9oCjbY73sdmlvaWXknAoKAAAAAEhdcQ8oJOknP/mJRowYoYULF2r79u3q1KmTLrnkErVtG7v15H/+8x9deeWVkmpe/nEkpk2bpoqKCh1//PEqLS3VP//5z5h7qpeVSNL777+v7du3S5LGjBkjn89nCQ7qa2QZXQWR0j0lDldMBYU1oPDZGmXSgwIAAAAAUldCAgpJ6tixo6677rp677vgggt0wQUXNOr3rl5y8d133+mKK66o9/777rsvcrx582b5fD6deOKJkbENGzbU+fzo63379j3c6aaurDbWc9sSjyzbVqNUUAAAAABA6op7k8xUkZubq86dO0uSli5dWue91VuodunSRd27d2/qqTUfDehBEY0eFAAAAACQupIioNixY4cWL16sefPmad68eVq8eLF27NjRZN/vueeek2madT6iG2d+8MEHkfHqgMEwDI0dO1ZSuEJi5cqVNX6vlStXRiooxo4de1hbmaa8epZ4eKmgAAAAAIC0kbCAwjRNPf300+rfv786d+6sCy64QBMmTNCECRN0wQUXqHPnzurfv7+eeeYZmaaZqGnWacqUKXI6w3/LP3ny5JgtRMvKyjR58mRJksvl0pQpU+I9xeQW0yRzrxQ6VCVh70FRQg8KAAAAAEhZCQko9u7dq7PPPlu/+MUvtG7dulqrGNatW6dbbrlFZ599tvbt25eIqdapV69emjp1qiQpLy9Pw4cP19y5c5WXl6e5c+dq+PDhysvLkyRNnTpVPXv2TOR0k4/X3hTVlMr2HbpsW+JRRkABAAAAACkr7k0yTdPU2LFj9eGHH0qS2rVrp8svv1ynn366jj32WEnhrUVXrVqll19+WUVFRfroo480duzYens9JMIDDzygnTt3avbs2VqzZo0mTJgQc88NN9yg+++/PwGzS3JZsbu2qHS35AtXVtiXeJT4WeIBAAAAAKkq7gHFP/7xD61YsUKGYejKK6/Uk08+qRYtWsTcd8011+jBBx/U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qpXcbrc6duyokSNH6uGHH9bu3bsb9HofffSRrr76anXr1k2ZmZk69thjdeGFF2rOnDlN/E5SkH2r0dI9kiSfx7bVKE0yAQAAACClxC7uTwOrVq3SFVdcUeO1Xbt2aenSpVq6dKkeeeQRvfTSS7rwwgtrfa177rlH9913n0KhUGRsx44devfdd/Xuu+/q73//u1555RVlZmY2+vtISTEBRTgk8toaZZb6qaAAAAAAgFSSlhUUktS1a1ddc801+r//+z+99tpr+vjjj/Xhhx9q7ty5+slPfiKn06mioiJdcskl+uKLL2p8jaefflr33nuvQqGQevTooVmzZmnVqlWaP3++zjnnHEnSwoULdf3118fzrTVv9iUeZVRQAAAAAEA6SMsKinPOOUc//PBDrdcvv/xyzZ8/X+PGjVNFRYXuvfdevfbaa5Z79uzZozvvvFOSdNxxx2nlypVq37595Pro0aM1btw4vfnmm5ozZ44mTZqkkSNHNsn7SSm19KCIraAgoAAAAACAVJKWFRROp7Peey699FL17t1bkrR8+fKY6zNnztT+/fslSQ899JAlnKj+Hk8++WTkez3yyCNHO+30kFXbEg9rllZayRIPAAAAAEglaRlQNFSLFi0kSeXl5THX5s+fL0lq2bKlLrvsshqfn5OTo/POO0+StHjxYh08eLBpJppK7BUU5fulYIAeFAAAAACQ4ggoavH111/r888/lyT16dPHcq2iokKrVq2SJA0bNkxut7vW1xkxYoQkye/3Ky8vr2kmm0rsAYUkle2Vz00PCgAAAABIZWnZg6I2paWlys/P15tvvqmHH35YgUD4Q/CUKVMs923cuFHBYPhv8O3hhV309fXr10eaZzbUtm3b6rxeWFh4WK+X9Oy7eEhS6W55PVRQAAAAAEAqS/uA4rnnntN1111X6/Xf/va3uvLKKy1j0aFBTk5Ona/ftWvXyPHWrVsPe37Rz08LzgzJ01LyHzg0VrpbXre1soIeFAAAAACQWtI+oKjNgAED9Mwzz2jw4MEx16J7SWRnZ9f5Oj6fL3JcXFzceBNMZd621oCibI+87mMst7CLBwAAAACklrQPKC699FINGjRIklRWVqZNmzbp5Zdf1uuvv64rrrhC06dP1+jRoy3PiW6aWVf/CUnyeDyR47KyssOeX31VF4WFhRoyZMhhv25S87aT9m45dF66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",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {
      "image/png": {
       "height": 371,
       "width": 532
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%config InlineBackend.figure_format='retina'\n",
    "plt.figure(figsize=(6, 4))\n",
    "plt.plot(train_ls, label=\"train loss\")\n",
    "plt.plot(test_ls, label=\"test loss\")\n",
    "plt.xlabel(\"Epoch\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型评估\n",
    "\n",
    "评估模型在测试集上的 RMSLE"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSLE: 0.152928\n"
     ]
    }
   ],
   "source": [
    "test_iter = DataLoader(test_dataset, batch_size=400, shuffle=False)\n",
    "rmsle = eval_model(model, device, test_iter, RMSLELoss())\n",
    "print(f\"RMSLE: {rmsle:.6f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
